import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D  

np.random.seed(42)  
n_samples = 500  

dim = 3
samples = np.random.multivariate_normal(
    np.zeros(dim), np.eye(dim), n_samples)  # 500x3
for i in range(samples.shape[0]):
    r = np.power(np.random.random(), 1.0/3.0)
    samples[i] *= r/np.linalg.norm(samples[i])


upper_samples = []
lower_samples = []
for x, y, z in samples:
    if z > 3*x+2*y-1:
        upper_samples.append((x, y, z))
    else:
        lower_samples.append((x, y, z))

fig = plt.figure('3D scatter plot')
ax = fig.add_subplot(111, projection='3d')  
uppers = np.array(upper_samples)
lowers = np.array(lower_samples)

ax.scatter(uppers[:, 0], uppers[:, 1], uppers[:, 2],
           c='r', marker='o')
ax.scatter(lowers[:, 0], lowers[:, 1], lowers[:, 2],
           c='g', marker='^')

plt.savefig('3D scatter plot.png') 
plt.show()
